package com.example.pay.controller;

import com.alibaba.fastjson.JSONObject;
import com.example.pay.domain.DataResponse;
import com.example.pay.util.AesCbcUtil;
import com.example.pay.util.HttpRequest;
import com.google.gson.Gson;

import com.google.gson.JsonObject;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: Wu YunXia
 * @Description:
 * @Date: Created in 15:21 2020/12/4
 * @Modefied By:
 */
@RestController
@RequestMapping(value = "/wechat")
public class WeChaConnView {

    /**
     * 解密用户敏感数据
     *
     * @param encryptedData 明文,加密数据
     * @param iv      加密算法的初始向量
     * @param code     用户允许登录后，回调内容会带上 code（有效期五分钟），开发者需要将 code 发送到开发者服务器后台，使用code 换取 session_key api，将 code 换成 openid 和 session_key
     * @return
     */
    @RequestMapping(value = "/decodeUser", method = RequestMethod.POST)
    public Object decodeUser(@RequestParam String encryptedData,
                                    @RequestParam String iv,
                                    @RequestParam String code) {
        DataResponse response = new DataResponse();
        Map<String, Object> map = new HashMap<>();


        //登录凭证不能为空
        if (code == null || code.length() == 0) {
                /*map.put("status", 0);
                map.put("msg", "code 不能为空");

                return map;*/
            response.setResult_code("failed");
            response.setResult_msg("code 不能为空");

            return response;
        }

        //小程序唯一标识  (在微信小程序管理后台获取)
        String wxspAppid = "wxbdf388337ee217e9";
        //小程序的 app secret (在微信小程序管理后台获取)
        String wxspSecret = "0d2fae2dc6282fdff12fdfc592337c17";
        //授权（必填）
        String grant_type = "authorization_code";

        //////////////// 1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid ////////////////
        //请求参数
        String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;
        //发送请求
        String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);
        System.out.println("sr:"+sr);
        //解析相应内容（转换成json对象）
        Gson gson = new Gson();
        JsonObject json = gson.fromJson(sr, JsonObject.class);
        System.out.println(json);
    //      JSONObject json = JSONObject.fromObject(sr);
        System.out.println("json.get(\"session_key\") :"+json.get("session_key") );

        if (json.get("session_key") == null) {
                /*map.put("status", 0);
                map.put("msg", "解密失败");

                return map;*/
            response.setResult_code("failed");
            response.setResult_msg("解密失败:" + json.get("errmsg").toString().replaceAll("\"", ""));

            return response;
        }
        //获取会话密钥（session_key）
        String session_key = json.get("session_key").toString();
        //用户的唯一标识（openid）
    //      String openid = (String) json.get("openid");
        String openid = json.get("openid").toString();


        try {
            String result = AesCbcUtil.decrypt(wxspAppid,encryptedData, session_key, iv);

            if (null != result && result.length() > 0) {


                JSONObject jsonObject = JSONObject.parseObject(result);

                System.out.println("user: " + jsonObject);

                Map userInfo1 = new HashMap();
                userInfo1.put("code",200);
                userInfo1.put("msg","解密成功");
                userInfo1.put("userInfo",jsonObject);


                return userInfo1;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        response.setResult_code("failed");
        response.setResult_msg("解密失败");

        return response;
    }
}

//"39_6q1EjE7ufq0ZR-GgXYVljMc0OU3xLAJlKE3K7s0NlRpDqzQ0CcnOkEMbmD4"